package com.example.stella.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.stella.models.Transaction;

import java.util.ArrayList;
import java.util.List;

/**
 * =================== 数据访问层 - 交易记录 ===================
 * 交易记录数据访问对象 - 处理交易记录的数据库操作
 * 职责：封装所有与交易记录相关的数据库操作，提供业务层调用接口
 * 设计模式：DAO模式（Data Access Object）
 */
public class TransactionDAO {
    
    // =================== 数据声明部分 ===================
    private DatabaseHelper dbHelper;   // 数据库连接助手

    /**
     * 构造函数 - 初始化数据库连接
     * @param context 应用上下文，用于创建数据库连接
     */
    public TransactionDAO(Context context) {
        dbHelper = new DatabaseHelper(context);
    }

    // =================== 数据实现部分 - 增删改查操作 ===================
    
    /**
     * 数据插入操作 - 添加新的交易记录到数据库
     * 功能：将Transaction对象转换为数据库记录并保存
     * @param transaction 要插入的交易记录对象
     * @return 新插入记录的ID，失败返回-1
     */
    public long insertTransaction(Transaction transaction) {
        // 获取可写数据库连接
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        // 数据映射：将Java对象转换为数据库字段值
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_USER_ID, transaction.getUserId());
        values.put(DatabaseHelper.COLUMN_TYPE, transaction.getType());
        values.put(DatabaseHelper.COLUMN_AMOUNT, transaction.getAmount());
        values.put(DatabaseHelper.COLUMN_CATEGORY, transaction.getCategory());
        values.put(DatabaseHelper.COLUMN_DESCRIPTION, transaction.getDescription());
        values.put(DatabaseHelper.COLUMN_DATE, transaction.getDate());
        values.put(DatabaseHelper.COLUMN_CREATED_AT, transaction.getCreatedAt());
        
        // 数据执行：插入记录并获取新生成的ID
        long id = db.insert(DatabaseHelper.TABLE_TRANSACTIONS, null, values);
        db.close();  // 关闭数据库连接，释放资源
        return id;
    }

    /**
     * 数据查询操作 - 获取指定用户的所有交易记录
     * 功能：根据用户ID查询交易记录，按日期降序排列（最新记录在前）
     * @param userId 用户ID
     * @return 交易记录列表
     */
    public List<Transaction> getTransactionsByUserId(int userId) {
        List<Transaction> transactions = new ArrayList<>();
        
        // 获取只读数据库连接
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        
        // 构建查询条件
        String selection = DatabaseHelper.COLUMN_USER_ID + " = ?";          // WHERE条件
        String[] selectionArgs = {String.valueOf(userId)};                  // 查询参数
        String orderBy = DatabaseHelper.COLUMN_DATE + " DESC";              // 排序：按日期降序
        
        // 执行查询
        Cursor cursor = db.query(DatabaseHelper.TABLE_TRANSACTIONS, null, selection, selectionArgs, null, null, orderBy);
        
        // 数据映射：将查询结果转换为Java对象列表
        while (cursor.moveToNext()) {
            Transaction transaction = new Transaction(
                cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_ID)),
                cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_USER_ID)),
                cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_TYPE)),
                cursor.getDouble(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_AMOUNT)),
                cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_CATEGORY)),
                cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_DESCRIPTION)),
                cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_DATE)),
                cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_CREATED_AT))
            );
            transactions.add(transaction);  // 添加到结果列表
        }
        
        // 资源清理
        cursor.close();
        db.close();
        return transactions;
    }

    // =================== 数据实现部分 - 统计计算操作 ===================
    
    /**
     * 数据计算操作 - 计算用户总余额（收入减去支出）
     * 功能：使用SQL聚合函数计算余额，收入为正数，支出为负数
     * @param userId 用户ID
     * @return 总余额
     */
    public double getTotalBalance(int userId) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        
        // 构建SQL查询：使用CASE WHEN实现条件聚合
        // 收入记录作为正数，支出记录作为负数，然后求和
        String query = "SELECT SUM(CASE WHEN " + DatabaseHelper.COLUMN_TYPE + " = '收入' THEN " + 
                      DatabaseHelper.COLUMN_AMOUNT + " ELSE -" + DatabaseHelper.COLUMN_AMOUNT + 
                      " END) FROM " + DatabaseHelper.TABLE_TRANSACTIONS + 
                      " WHERE " + DatabaseHelper.COLUMN_USER_ID + " = ?";
        String[] selectionArgs = {String.valueOf(userId)};
        
        // 执行原生SQL查询
        Cursor cursor = db.rawQuery(query, selectionArgs);
        double balance = 0.0;
        if (cursor.moveToFirst()) {
            balance = cursor.getDouble(0);  // 获取计算结果
        }
        
        // 资源清理
        cursor.close();
        db.close();
        return balance;
    }

    /**
     * 数据计算操作 - 计算用户总收入
     * 功能：调用通用方法计算指定类型的交易总额
     * @param userId 用户ID
     * @return 总收入金额
     */
    public double getTotalIncome(int userId) {
        return getTotalByType(userId, "收入");
    }

    /**
     * 数据计算操作 - 计算用户总支出
     * 功能：调用通用方法计算指定类型的交易总额
     * @param userId 用户ID
     * @return 总支出金额
     */
    public double getTotalExpense(int userId) {
        return getTotalByType(userId, "支出");
    }

    /**
     * 数据计算工具方法 - 根据类型计算用户的收入或支出总额
     * 功能：通用的按类型统计方法，避免代码重复
     * @param userId 用户ID
     * @param type 交易类型（收入/支出）
     * @return 指定类型的交易总额
     */
    private double getTotalByType(int userId, String type) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        
        // 构建查询条件：用户ID和交易类型
        String selection = DatabaseHelper.COLUMN_USER_ID + " = ? AND " + DatabaseHelper.COLUMN_TYPE + " = ?";
        String[] selectionArgs = {String.valueOf(userId), type};
        
        // 执行聚合查询：计算金额总和
        Cursor cursor = db.query(DatabaseHelper.TABLE_TRANSACTIONS, 
                new String[]{"SUM(" + DatabaseHelper.COLUMN_AMOUNT + ")"}, 
                selection, selectionArgs, null, null, null);
        
        double total = 0.0;
        if (cursor.moveToFirst()) {
            total = cursor.getDouble(0);    // 获取SUM结果
        }
        
        // 资源清理
        cursor.close();
        db.close();
        return total;
    }

    // =================== 数据实现部分 - 删除操作 ===================
    
    /**
     * 数据删除操作 - 删除指定ID的交易记录
     * 功能：根据主键ID删除单条交易记录
     * @param id 要删除的交易记录ID
     * @return 删除成功返回true，失败返回false
     */
    public boolean deleteTransaction(int id) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        
        // 构建删除条件
        String selection = DatabaseHelper.COLUMN_ID + " = ?";
        String[] selectionArgs = {String.valueOf(id)};
        
        // 执行删除操作
        int rowsDeleted = db.delete(DatabaseHelper.TABLE_TRANSACTIONS, selection, selectionArgs);
        db.close();  // 关闭数据库连接
        
        // 返回操作结果：如果影响行数大于0则删除成功
        return rowsDeleted > 0;
    }
} 